<?php
namespace app\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;
use think\facade\Log;

class Fixedassets extends BaseController
{
    /**
     * 获取物资列表
     */
    public function getList()
    {
        $page = input('page/d', 1);
        $pageSize = input('pageSize/d', 20);
        $title = input('title/s', '');
        $categoryId = input('categoryId/d', 0);
        
        // 记录请求参数
        Log::info('物资列表请求参数: ' . json_encode([
            'page' => $page,
            'pageSize' => $pageSize,
            'title' => $title,
            'categoryId' => $categoryId
        ]));
        
        $where = [];
        if (!empty($title)) {
            $where[] = ['a.name', 'like', "%{$title}%"];
        }
        if (!empty($categoryId)) {
            $where[] = ['a.category_id', '=', $categoryId];
        }
        
        try {
            // 检查表是否存在
            if (!$this->tableExists('assets')) {
                Log::error('物资表不存在');
                return json([
                    'code' => 500,
                    'msg' => '物资表不存在',
                    'data' => [
                        'list' => [],
                        'total' => 0
                    ]
                ]);
            }
            
            $count = Db::name('assets')
                ->alias('a')
                ->where($where)
                ->count();
                
            $list = Db::name('assets')
                ->alias('a')
                ->join('assets_category c', 'a.category_id = c.id', 'LEFT')
                ->where($where)
                ->field('a.*, c.name as category_name')
                ->page($page, $pageSize)
                ->order('a.id', 'desc')
                ->select()
                ->toArray();
                
            Log::info('物资列表查询结果: 总数=' . $count . ', 列表数=' . count($list));
            
            return json([
                'code' => 200,
                'msg' => '获取成功',
                'data' => [
                    'list' => $list,
                    'total' => $count
                ]
            ]);
        } catch (\Exception $e) {
            Log::error('物资列表查询异常: ' . $e->getMessage());
            return json([
                'code' => 500,
                'msg' => '查询异常: ' . $e->getMessage(),
                'data' => [
                    'list' => [],
                    'total' => 0
                ]
            ]);
        }
    }
    
    /**
     * 获取物资分类
     */
    public function getCategoryList()
    {
        Log::info('获取物资分类请求');
        
        try {
            // 检查表是否存在
            if (!$this->tableExists('assets_category')) {
                Log::error('物资分类表不存在');
                return json([
                    'code' => 500,
                    'msg' => '物资分类表不存在',
                    'data' => []
                ]);
            }
            
            $list = Db::name('assets_category')
                ->field('id, name')
                ->select()
                ->toArray();
                
            // 记录查询结果
            Log::info('物资分类查询结果: ' . json_encode($list));
                
            // 转换为树形结构
            $treeData = [];
            foreach ($list as $item) {
                $treeData[] = [
                    'id' => intval($item['id']),
                    'label' => $item['name'],
                ];
            }
            
            Log::info('物资分类树形结构: ' . json_encode($treeData));
                
            return json([
                'code' => 200,
                'msg' => '获取成功',
                'data' => $treeData
            ]);
        } catch (\Exception $e) {
            Log::error('物资分类查询异常: ' . $e->getMessage());
            return json([
                'code' => 500,
                'msg' => '查询异常: ' . $e->getMessage(),
                'data' => []
            ]);
        }
    }
    
    /**
     * 添加或编辑物资
     */
    public function doEdit()
    {
        $data = Request::post();
        Log::info('添加/编辑物资请求数据: ' . json_encode($data));
        
        // 验证必填字段
        if (empty($data['name'])) {
            return json(['code' => 400, 'msg' => '物资名称不能为空']);
        }
        if (empty($data['category_id'])) {
            return json(['code' => 400, 'msg' => '物资分类不能为空']);
        }
        if (!isset($data['quantity']) || $data['quantity'] < 0) {
            return json(['code' => 400, 'msg' => '入库数量不能为空或小于0']);
        }
        
        // 处理数据
        $saveData = [
            'name' => $data['name'],
            'category_id' => $data['category_id'],
            'specification' => $data['specification'] ?? '',
            'unit' => $data['unit'] ?? '',
            'quantity' => $data['quantity'],
            'price' => $data['price'] ?? 0,
            'remark' => $data['remark'] ?? '',
        ];
        
        try {
            // 检查表是否存在
            if (!$this->tableExists('assets')) {
                Log::error('物资表不存在');
                return json(['code' => 500, 'msg' => '物资表不存在']);
            }
            
            // 新增或更新
            if (isset($data['id']) && $data['id'] > 0) {
                // 更新
                Db::name('assets')->where('id', $data['id'])->update($saveData);
                $msg = '更新成功';
            } else {
                // 新增
                Db::name('assets')->insert($saveData);
                $msg = '添加成功';
            }
            
            return json(['code' => 200, 'msg' => $msg]);
        } catch (\Exception $e) {
            Log::error('添加/编辑物资异常: ' . $e->getMessage());
            return json(['code' => 500, 'msg' => '操作失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 删除物资
     */
    public function doDelete()
    {
        $ids = Request::post('ids');
        Log::info('删除物资请求: ids=' . $ids);
        
        if (empty($ids)) {
            return json(['code' => 400, 'msg' => '请选择要删除的记录']);
        }
        
        try {
            // 检查表是否存在
            if (!$this->tableExists('assets')) {
                Log::error('物资表不存在');
                return json(['code' => 500, 'msg' => '物资表不存在']);
            }
            
            $idArr = explode(',', $ids);
            Db::name('assets')->whereIn('id', $idArr)->delete();
            
            return json(['code' => 200, 'msg' => '删除成功']);
        } catch (\Exception $e) {
            Log::error('删除物资异常: ' . $e->getMessage());
            return json(['code' => 500, 'msg' => '删除失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 添加物资分类
     */
    public function addCategory()
    {
        $name = Request::post('name');
        Log::info('添加物资分类请求: name=' . $name);
        
        if (empty($name)) {
            return json(['code' => 400, 'msg' => '分类名称不能为空']);
        }
        
        try {
            // 检查表是否存在
            if (!$this->tableExists('assets_category')) {
                Log::error('物资分类表不存在');
                return json(['code' => 500, 'msg' => '物资分类表不存在']);
            }
            
            // 检查是否已存在
            $exists = Db::name('assets_category')->where('name', $name)->find();
            if ($exists) {
                return json(['code' => 400, 'msg' => '该分类名称已存在']);
            }
            
            // 添加分类
            Db::name('assets_category')->insert(['name' => $name]);
            
            return json(['code' => 200, 'msg' => '添加分类成功']);
        } catch (\Exception $e) {
            Log::error('添加物资分类异常: ' . $e->getMessage());
            return json(['code' => 500, 'msg' => '添加分类失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 删除物资分类
     */
    public function deleteCategory()
    {
        $id = Request::post('id');
        Log::info('删除物资分类请求: id=' . $id);
        
        if (empty($id)) {
            return json(['code' => 400, 'msg' => '请选择要删除的分类']);
        }
        
        try {
            // 检查表是否存在
            if (!$this->tableExists('assets_category')) {
                Log::error('物资分类表不存在');
                return json(['code' => 500, 'msg' => '物资分类表不存在']);
            }
            
            // 检查是否有关联的物资
            if ($this->tableExists('assets')) {
                $count = Db::name('assets')->where('category_id', $id)->count();
                if ($count > 0) {
                    return json(['code' => 400, 'msg' => '该分类下有关联物资，不能删除']);
                }
            }
            
            // 删除分类
            Db::name('assets_category')->where('id', $id)->delete();
            
            return json(['code' => 200, 'msg' => '删除分类成功']);
        } catch (\Exception $e) {
            Log::error('删除物资分类异常: ' . $e->getMessage());
            return json(['code' => 500, 'msg' => '删除分类失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 检查表是否存在
     */
    private function tableExists($tableName)
    {
        try {
            $prefix = config('database.connections.mysql.prefix');
            $fullTableName = $prefix . $tableName;
            
            $result = Db::query("SHOW TABLES LIKE '{$fullTableName}'");
            return !empty($result);
        } catch (\Exception $e) {
            Log::error('检查表是否存在异常: ' . $e->getMessage());
            return false;
        }
    }
}